<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>InitPHP框架 PHP框架 - A PHP Framework - Hook插件机制</title>
<link href="static/common.css" type="text/css" rel="stylesheet" />
<meta name="keywords" content="php框架，国产php框架, initphp框架，MVC，分层体系" />
<meta name="description" content="initphp框架是一款国产php框架。initphp框架主要基于MVC模式，具备代码清晰，操作简单，功能齐全，开发快速，高效安全等特点，是您选择php框架的首选。" />
</head>
<body>
<div class="header">
  <div class="header_nav">InitPHP (A PHP Framework) 用户手册</div>
  <div class="header_div">
    <div class="header_title">第5章 5.2 Hook插件机制</div>
    <div class="header_right"><a href="5_1.htm">上一页</a> <a href="5_3.htm">下一页</a> </div>
  </div>
</div>

<div class="title">
  <h3>Hook插件使用说明：</h3>
</div>
<ul>
  <li>框架的扩展性非常重要，InitPHP提供了非常简单的工具类、扩展类等扩展方式。项目的扩展也是非常重要的，InitPHP框架提供Hook机制（插件或者钩子）来实现项目扩展</li>
  <li>看过Wordpress的朋友应该都知道Wordpress的插件机制做得非常好，所以Wordpress这款开源软件吸引了无数的开发者为它开发插件</li>
  <li>InitPHP框架的Hook原理：在项目代码中，你认为要扩展（暂时不扩展）的地方放置一个钩子函数，等需要扩展的时候，把需要实现的类和函数挂载到这个钩子上，就可以实现扩展了</li>
  <li>一个钩子可以挂载多个实现</li>
</ul>
<div class="title">
  <h3>InitPHP框架的Hook机制配置文件：</h3>
</div>
<ul>
  <li>主要配置</li>
</ul>
<pre id="PHP" class="prettyprint">
/**
 * 插件Hook配置
 * 1. 如果你需要使用InitPHP::hook() 钩子函数来实现插件功能
 * 2. 详细查看钩子的使用方法
 */
$InitPHP_conf['hook']['path']          = 'library/hook'; //插件文件夹目录， 不需要加'/'
$InitPHP_conf['hook']['class_postfix'] = 'Hook'; //默认插件类名后缀
$InitPHP_conf['hook']['file_postfix']  = '.hook.php'; //默认插件文件名称
$InitPHP_conf['hook']['config']        = 'hook.conf.php'; //配置文件
</pre>
<div class="title">
  <h3>钩子函数使用InitPHP::hook('钩子名称', '传递的参数')：</h3>
</div>
<ul>
  <li>在PHP和HTML模板中都可以放置你的钩子函数，例如：InitPHP::hook('guest', 'Hook')</li>
</ul>
<pre id="PHP" class="prettyprint">
class indexController extends Controller {
	
	public $initphp_list = array('test'); 
	
	public function run() {
		InitPHP::hook('guest', 'Hook'); //放置一个guest名称的钩子，传递的参数为Hook
		$this->view->set_tpl('test'); //设置一个test.htm的模板页面
		$this->view->display(); //模板显示
	}
	
	/**
	 * @return testService
	 */
	private function getTestService() {
		return InitPHP::getService('test','test');
	}

}
</pre>
<div class="title">
  <h3>Hook自身的钩子挂载配置文件hook.conf.php：</h3>
</div>
<ul>
  <li>通过过这个配置文件，可以知道一个钩子上挂载了多少个实现，需要实现那些类中的函数</li>
  <li>下面的例子中：一个guest的钩子上，挂载了test类中的run函数和test类中的aa函数</li>
</ul>
<pre id="PHP" class="prettyprint">
/*
 *  钩子名称 => array(array('挂钩上对应的类名称', '函数名称')) 一个挂钩多个函数
 *  钩子名称 => array(挂钩上对应的类名称,函数名称) //一个挂钩一个钩子函数
 */
return array(
	//guest挂钩，InitPHP::hook('guest','Hook'); 在程序中放置钩子，guest钩子名称，Hook传递的参数
	'guest' => array( 
		array('test', 'run'), 
		array('test', 'aa')
	)
);
</pre>
<div class="title">
  <h3>具体函数test.hook.php：</h3>
</div>
<ul>
  <li>每个函数都需要传递一个$data的参数，这个参数是外部传递进来的</li>
</ul>
<pre id="PHP" class="prettyprint">
//一个测试的钩子
class testHook {
    public function run($data) {
  		echo '第一个简单的' . $data;
    }
	
	public function aa($data) {
		echo '<br/>第二个简单的' . $data;
	}
}
</pre>


<div class="footer">版权所有：<a href="">http://initphp.com</a> InitPHP (A PHP Framework) By @Aliyun_zhuli</div>
<script src="static/jquery.js" type="text/javascript"></script>
<link href="static/prettify/prettify.css" rel="stylesheet" type="text/css">
<script src="static/prettify/prettify.js" type="text/javascript"></script>
<script type="text/javascript" src="static/comm.js"></script>
</body>
</html>
